import dayjs from "dayjs";
import relativeTime from "dayjs/plugin/relativeTime";
import utc from "dayjs/plugin/utc";
import timezone from "dayjs/plugin/timezone";
import isToday from "dayjs/plugin/isToday";
import isYesterday from "dayjs/plugin/isYesterday";
import weekday from "dayjs/plugin/weekday";
import "dayjs/locale/zh-cn";

// 扩展插件
dayjs.extend(relativeTime);
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.extend(isToday);
dayjs.extend(isYesterday);
dayjs.extend(weekday);

// 设置中文
dayjs.locale("zh-cn");

// 常用日期格式
export const DATE_FORMATS = {
  DATE: "YYYY-MM-DD",
  TIME: "HH:mm:ss",
  DATETIME: "YYYY-MM-DD HH:mm:ss",
  DATE_TIME_SHORT: "YYYY-MM-DD HH:mm",
  MONTH_DAY: "MM-DD",
  YEAR_MONTH: "YYYY-MM",
  CHINESE_DATE: "YYYY年MM月DD日",
  CHINESE_DATETIME: "YYYY年MM月DD日 HH:mm",
};

// 日期工具函数
export const dateUtils = {
  // 格式化当前时间
  now: (format = DATE_FORMATS.DATETIME) => dayjs().format(format),

  // 格式化指定时间
  format: (date, format = DATE_FORMATS.DATETIME) => dayjs(date).format(format),

  // 直接获取年月日 - 最常用
  year: () => dayjs().year(), // 获取当前年份：2024
  month: () => dayjs().month() + 1, // 获取当前月份：1-12
  date: () => dayjs().date(), // 获取当前日期：1-31
  day: () => dayjs().day(), // 获取星期：0-6 (0是周日)

  // 获取指定日期的年月日
  getYear: (date) => dayjs(date).year(),
  getMonth: (date) => dayjs(date).month() + 1,
  getDate: (date) => dayjs(date).date(),
  getDay: (date) => dayjs(date).day(),

  // 转换为年月日格式 - 超级简单！
  toYMD: (date = new Date()) => {
    const d = dayjs(date);
    return {
      year: d.year(),
      month: d.month() + 1,
      date: d.date(),
      day: d.day(),
    };
  },

  // 转换为中文年月日
  toChinese: (date = new Date()) => {
    const d = dayjs(date);
    return `${d.year()}年${d.month() + 1}月${d.date()}日`;
  },

  // 转换为简短格式
  toShort: (date = new Date()) => {
    const d = dayjs(date);
    return `${d.month() + 1}月${d.date()}日`;
  },

  // 转换为数字格式
  toNumbers: (date = new Date()) => {
    const d = dayjs(date);
    return `${d.year()}-${String(d.month() + 1).padStart(2, "0")}-${String(
      d.date()
    ).padStart(2, "0")}`;
  },

  // 相对时间（几分钟前、几小时前等）
  fromNow: (date) => dayjs(date).fromNow(),

  // 判断是否为今天
  isToday: (date) => dayjs(date).isToday(),

  // 判断是否为昨天
  isYesterday: (date) => dayjs(date).isYesterday(),

  // 获取今天的开始时间
  startOfToday: () => dayjs().startOf("day"),

  // 获取今天的结束时间
  endOfToday: () => dayjs().endOf("day"),

  // 获取本周开始时间
  startOfWeek: () => dayjs().startOf("week"),

  // 获取本月开始时间
  startOfMonth: () => dayjs().startOf("month"),

  // 计算两个日期的差值
  diff: (date1, date2, unit = "day") => dayjs(date1).diff(dayjs(date2), unit),

  // 添加时间
  add: (date, value, unit) => dayjs(date).add(value, unit),

  // 减去时间
  subtract: (date, value, unit) => dayjs(date).subtract(value, unit),

  // 获取友好的时间显示
  getFriendlyTime: (date) => {
    const target = dayjs(date);
    const now = dayjs();

    if (target.isToday()) {
      return `今天 ${target.format("HH:mm")}`;
    } else if (target.isYesterday()) {
      return `昨天 ${target.format("HH:mm")}`;
    } else if (now.diff(target, "day") <= 7) {
      // 一周内显示星期
      const weekdays = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
      return `${weekdays[target.day()]} ${target.format("HH:mm")}`;
    } else if (target.year() === now.year()) {
      // 今年内显示月日
      return target.format("MM-DD HH:mm");
    } else {
      // 其他显示完整日期
      return target.format("YYYY-MM-DD HH:mm");
    }
  },

  // 获取营业时间状态
  getBusinessStatus: (openTime = "09:00", closeTime = "22:00") => {
    const now = dayjs();
    const open = dayjs(`${now.format("YYYY-MM-DD")} ${openTime}:00`);
    const close = dayjs(`${now.format("YYYY-MM-DD")} ${closeTime}:00`);

    if (now.isAfter(open) && now.isBefore(close)) {
      return { status: "营业中", color: "#00c000" };
    } else {
      return { status: "休息中", color: "#ff6b6b" };
    }
  },

  // 获取时间段
  getTimeRange: (days = 7) => {
    const end = dayjs().endOf("day");
    const start = dayjs()
      .subtract(days - 1, "day")
      .startOf("day");
    return { start, end };
  },

  // ========== 时间戳格式化（通用） ==========

  // 格式化时间戳为日期时间（最常用）
  formatTimestamp: (timestamp, format = DATE_FORMATS.DATETIME) => {
    if (!timestamp) return "";
    return dayjs(timestamp).format(format);
  },

  // 格式化时间戳为日期
  formatTimestampToDate: (timestamp) => {
    if (!timestamp) return "";
    return dayjs(timestamp).format(DATE_FORMATS.DATE);
  },

  // 格式化时间戳为时间
  formatTimestampToTime: (timestamp) => {
    if (!timestamp) return "";
    return dayjs(timestamp).format(DATE_FORMATS.TIME);
  },

  // 格式化时间戳为短格式（年-月-日 时:分）
  formatTimestampToShort: (timestamp) => {
    if (!timestamp) return "";
    return dayjs(timestamp).format(DATE_FORMATS.DATE_TIME_SHORT);
  },

  // 格式化时间戳为友好格式（今天/昨天/具体日期）
  formatTimestampToFriendly: (timestamp) => {
    if (!timestamp) return "";
    return dateUtils.getFriendlyTime(timestamp);
  },

  // 格式化时间戳为年-月格式
  formatTimestampToYearMonth: (timestamp) => {
    if (!timestamp) return "";
    return dayjs(timestamp).format(DATE_FORMATS.YEAR_MONTH);
  },
};

// 默认导出 dayjs
export default dayjs;
